[iOS][Objective-C] iOS 9 にしたら起こった不具合とその対策 [MKMapView編]
MapKit でアノテーションに画像が適用されない
MKMapView
MapKit の MKMapView では、地図の上にアノテーション(ピンなど)を立てることが出来ます。
緯度・経度を指定することで、特定のポイントを指定可能です。
MKMapView の基本的な使い方は、以下の記事が参考になります。
[iOS][小ネタ] 地図アプリ作成時に役に立ちそうな MKMapView の 目的別実装例 | Developers.IO
アノテーションに画像を指定 (iOS 8)
さらに、アノテーションを表示する際、形状をピンから指定した画像に変更できます。
この際、iOS 8 までの端末では、以下の様なコードで画像指定を実現できました。
MKMapViewDelegate プロトコルに準拠している宣言をすると、適切なタイミングで以下のデリゲートメソッドが呼ばれます。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation
この中で、渡ってくる annotationを利用して MKPinAnnotationViewのインスタンスを生成し、image プロパティに UIImage型の画像データを入れることで、画像付きのアノテーションが表示されます。
[mapView dequeueReusableAnnotationViewWithIdentifier:PinIdentifier]; annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:PinIdentifier]; annotationView.image = [UIImage imageNamed:@"pinImage"]; annotationView.annotation = annotation; self.annotationView = annotationView; return annotationView;
上記を含めたコードを iOS 8.4.1 で実行した所、正常に表示されました。
アノテーションに画像を指定 (iOS 9)
一方で、上記と同じコードを指定した場合、iOS 9.0.2 の端末では、ピンに画像が表示されません。
解決法
MKPinAnnotationView を MKAnnotationView に変更すると、正常に表示されます。
上記のコードの以下の部分を変更することで、iOS 9 でも正常に表示されるようになりました。
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:PinIdentifier];
まとめ
iOS 9になって、描画周りが変わり、iOS 8までとは違う挙動が起こっているように見受けられます。もし検証ができましたら、追って記事にしたいと思います。
ありがとうございました!